package num32II;

import java.util.ArrayList;
import java.util.List;

/**
 * @author : DuJiabao
 * @Date : 2021/1/22 17:06
 * @Project : sword-finger-offer
 * @File : null.java
 * @Desc :从上到下按层打印二叉树，同一层的节点按从左到右的顺序打印，每一层打印到一行。
 * https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/
 */

/**
 *
 */
public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null) return res;
        ArrayList<TreeNode> queue = new ArrayList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            ArrayList<TreeNode> tempQueue = new ArrayList<>();
            List<Integer> temRes = new ArrayList<>();  // 为了防止因为修改queue而导致的下面循环出现问题，该方法采用临时存储的方式，在后面再值赋回给queue
            for (TreeNode treeNode : queue) {
                temRes.add(treeNode.val);
                if (treeNode.left != null) tempQueue.add(treeNode.left);
                if (treeNode.right != null) tempQueue.add(treeNode.right);
            }
            res.add(temRes);
            queue = tempQueue;  // 把临时保存的queue给回queue。更巧妙的方法，可以看第二个solution
        }
        return res;
    }
}
